package mint.modules.symbol;

import java.util.Formatter;

import mint.modules.generator.ConstructorDeclarationNode;
import mint.modules.generator.FormalParameterNode;

public class ConstructorSymbol extends Symbol {

	private ConstructorDeclarationNode node;
	private SymbolModifier modifier;

	public ConstructorSymbol(ConstructorDeclarationNode ctorNode) {
		super(ctorNode.getName());
		node = ctorNode;
		
		String modifierText = node.getModifier();
		
		if (modifierText.equals("public"))
		{
			modifier = SymbolModifier.publicModifier;
		}
		else if (modifierText.equals("private"))
		{
			modifier = SymbolModifier.privateModifier;
		}
		else if (modifierText.equals("protected"))
		{
			modifier = SymbolModifier.protectedModifier;
		}
		else
			modifier = SymbolModifier.publicModifier;		
	}
	
	public SymbolModifier getModifier()
	{
		return modifier;
	}
	
	public int getParameterListSize()
	{
		return node.getParameterListSize();
	}
	
	public FormalParameterNode getParameter(int i)
	{
		return node.getParameter(i);
	}
	
	public boolean isDefaultConstructor()
	{
		return node.isDefaultConstructor();
	}

	@Override
	public SymbolType getSymbolType() {
		return SymbolType.Constructor;
	}

	@Override
	public void print(Formatter output, int tabSize) {
		for (int i = 1; i <= tabSize; i++)
			output.format("\t");
		output.format("Constructor: %s %s(", node.getModifier(), node.getName());
		
		for(int i = 0; i < node.getParameterListSize(); i++)
		{
			FormalParameterNode param = node.getParameter(i);
			Symbol symbol = node.searchSymbol(param.getName(), node.getContainerClass(), false);
			
			if (symbol.getSymbolType() == SymbolType.Parameter)
			{
				symbol.print(output, 0);
			}
			
			if (i < node.getParameterListSize() - 1)
				output.format(", ");
		}
		output.format(")\n");		
	}

}
